package com.casa_apoio.estoque.controller;

import com.casa_apoio.estoque.mode.dao.ProdutoDAO;
import com.casa_apoio.estoque.mode.dao.SaidaDAO;
import com.casa_apoio.estoque.mode.entity.Produto;
import com.casa_apoio.estoque.mode.entity.Saida;
import com.casa_apoio.model.dao.AcessoDAO;
import com.casa_apoio.model.dao.FuncionarioDAO;
import com.casa_apoio.model.entity.Acesso;
import com.casa_apoio.model.entity.Funcionario;
import com.casa_apoio.util.FacesContextUtil;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

@ManagedBean
@ViewScoped
public class MbSaida implements Serializable {

    private static final long serialVersionUID = 1L;

    private Saida saida;
    private List<Saida> saidas;
    private Produto produto;
    private List<Produto> produtos;

    private SaidaDAO saidaDAO() {
        SaidaDAO<Saida> dao = new SaidaDAO<Saida>(Saida.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private ProdutoDAO produtoDAO() {
        ProdutoDAO<Produto> dao = new ProdutoDAO<Produto>(Produto.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private AcessoDAO acessoDAO() {
        AcessoDAO<Acesso> dao = new AcessoDAO<Acesso>(Acesso.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private FuncionarioDAO funcionarioDAO() {
        FuncionarioDAO<Funcionario> dao = new FuncionarioDAO<Funcionario>(Funcionario.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    public String saidaProduto() {
        // System.out.println("==== == ==== Produto " + produto.getDescricao());
        try {
            saida.setFuncionario(usuarioLogado());
            produto = (Produto) produtoDAO().getEntity(saida.getProduto().getIdProduto());
            if (produto.getEstoque() >= saida.getQuantidade() && saida.getQuantidade() > 0) {
                produto.setEstoque(produto.getEstoque() - saida.getQuantidade());
                produtoDAO().atualizar(produto);
                saidaDAO().salvar(saida);
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, produto.getDescricao() + " = " + produto.getEstoque()+" Unidade", "Informação"));
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Qunatidade no estoque menor que solicitada", "Informação"));
                return null;
            }
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Saida realizada com sucesso", "Informação"));
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro ", "Informação"));
            return null;
        }

        return "/restrict/estoque/saidas.faces";
    }

    public Saida getSaida() {
        if (saida == null) {
            saida = new Saida();
            saida.setData(new Date());
        }
        return saida;
    }

    private Funcionario usuarioLogado() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext external = context.getExternalContext();
        String login = external.getRemoteUser();

        List<Acesso> lista = acessoDAO().verificaLogin(login);
        Acesso a = lista.get(0);
        Funcionario f = (Funcionario) funcionarioDAO().getEntity(a.getFuncionario().getIdFuncionario());
        return f;
    }

    public void setSaida(Saida saida) {
        this.saida = saida;
    }

    public List<Saida> getSaidas() {
        saidas = saidaDAO().siadaPorData(new Date());
        return saidas;
    }

    public void setSaidas(List<Saida> saidas) {
        this.saidas = saidas;
    }

    public Produto getProduto() {
        if (produto == null) {
            produto = new Produto();
        }
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public List<Produto> getProdutos() {
        if (produtos == null) {
            produtos = produtoDAO().listaProdutos();
        }
        return produtos;
    }

    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }

}
